package cn.yunbamboos.id;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.SystemClock;
import cn.hutool.core.lang.Snowflake;
import org.springframework.stereotype.Component;

import java.util.Date;

public class SnowflakeIdGenerator {

    /**
     * 初始化时间起点（null表示默认起始日期）,后期修改会导致id重复,如果要修改连workerId dataCenterId，慎用
     */
    private final Date epochDate = DateUtil.parse("2024-01-01 00:00:00", DatePattern.NORM_DATETIME_PATTERN);
    /**
     * 工作机器节点id
     */
    private final int workerId = 1;
    /**
     * 数据中心id
     */
    private final int dataCenterId = 1;
    /**
     * 是否使用{@link SystemClock} 获取当前时间戳
     */
    private boolean useSystemClock = false;
    /**
     * 允许时间回拨的毫秒数
     */
    private long timeOffset = 2000L;
    /**
     * 限定一个随机上限，在不同毫秒下生成序号时，给定一个随机数，避免偶数问题，0表示无随机，上限不包括值本身。
     */
    private int randomSequenceLimit = 200;

    private final Snowflake snowflake;

    public SnowflakeIdGenerator() {
        this.snowflake = new Snowflake(epochDate, workerId, dataCenterId, useSystemClock, timeOffset, randomSequenceLimit);
    }

    public long nextId() {
        return snowflake.nextId();
    }

    public String nextIdStr() {
        return snowflake.nextIdStr();
    }

}
